Android

모던 안드로이드 (오준석의 생존코딩)

 

  1. DB를 이용한 데이터 저장 방법 Room
  2. LiveData
  3. Room 비동기 처리
  4. UI와 로직 분리 ViewModel
  5. DataBinding

 

 


 

모던 안드로이드 #1 – DB를 이용한 데이터 저장 방법 Room

모던 안드로이드 #3 LiveData

모던 안드로이드 #5 – Room 비동기 처리

모던 안드로이드 #7 – UI와 로직 분리 ViewModel

 

https://developer.android.com/training/data-storage/room

https://developer.android.com/topic/libraries/architecture/adding-components

https://developer.android.com/jetpack/androidx/releases/lifecycle

 

Room 라이브러리 추가

MainActivity 에서 onCreate() 에서 Room 입력하고 Alt + Enter -> Add Dependency

 

 

activity_main.xml

 

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/todo_edit"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:hint="할 일"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toStartOf="@+id/add_button"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/add_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent" />

    <TextView
        android:id="@+id/result_text"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/add_button" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

import androidx.room.Database;
import androidx.room.RoomDatabase;

@Database(entities = {Todo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract TodoDao todoDao();
}

 

 

import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity
public class Todo {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String title;

    public Todo(String title) {
        this.title = title;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Todo{" +
                "id='" + id + '\'' +
                ", title='" + title + '\'' +
                '}';
    }
}

 

 

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;

@Dao
public interface TodoDao {
    @Query("SELECT * FROM ToDo")
    LiveData<List<Todo>> getAll();

    @Insert
    void insert(Todo todo);

    @Update
    void Update(Todo todo);

    @Delete
    void Delete(Todo todo);
}

 

 

 

 


 

모던 안드로이드 #9 – DataBinding

 

https://developer.android.com/topic/libraries/data-binding/start#build_environment

 

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.myhome.mymodernexercisingapplication.MainViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <EditText
            android:id="@+id/todo_edit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp"
            android:hint="할 일"
            android:text="@={viewModel.newTodo}"  // 양방향 바인딩
            android:inputType="textPersonName"
            app:layout_constraintEnd_toStartOf="@+id/add_button"
            app:layout_constraintStart_toStartOf="parent" />

        <Button
            android:id="@+id/add_button"
            android:onClick="@{() -> viewModel.insert(viewModel.newTodo)}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:text="Button"
            app:layout_constraintEnd_toEndOf="parent" />

        <TextView
            android:id="@+id/result_text"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            android:text="@{viewModel.todos.toString()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/add_button" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

 

import android.app.Application;
import android.os.AsyncTask;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.ViewModel;
import androidx.room.Room;

import java.util.List;

public class MainViewModel extends AndroidViewModel {
    private AppDatabase db;
    public LiveData<List<Todo>> todos;
    public String newTodo;


    public MainViewModel(@NonNull Application application) {
        super(application);

        db = Room.databaseBuilder(application, AppDatabase.class, "todo-db")
                //.allowMainThreadQueries()  // 편의상 메인쓰레드에서 동작하도록 설정
                .build();
        todos = getAll();
    }

    public LiveData<List<Todo>> getAll() {
        return db.todoDao().getAll();
    }

    public void insert(String todo) {
        new InsertAsyncTask(db.todoDao()).execute(new Todo(todo));
    }

    private static class InsertAsyncTask extends AsyncTask<Todo, Void, Void> {
        private TodoDao mTodoDao;

        public InsertAsyncTask(TodoDao todoDao) {
            this.mTodoDao = todoDao;
        }

        @Override
        protected Void doInBackground(Todo... todos) {
            mTodoDao.insert(todos[0]);
            return null;
        }
    }
}

 

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setLifecycleOwner(this);
        MainViewModel viewModel = new ViewModelProvider(this).get(MainViewModel.class);
        binding.setViewModel(viewModel);
    }
}

 

 


 

모던 안드로이드 #18 [백그라운드 처리] 3. AsyncTask를 대신할 Java 비동기 처리 솔루션

모던 안드로이드 #19 [백그라운드 처리] 4. LiveData 연동하여 UI 유지하기

 

https://developer.android.com/guide/background/threading

https://developer.android.com/topic/libraries/architecture/adding-components

 

 

 

 

 

 

 

 

 

 

 


 

모던 안드로이드 (오준석의 생존코딩) 유튜브 강의
https://www.youtube.com/watch?v=pG6OkJ3rSjg&list=PLxTmPHxRH3VXHOBnaGQcbSGslbAjr8obc&index=1

 

될 때까지 안드로이드 (오준석의 생존코딩) 깃헙
https://github.com/junsuk5/android-first-book

 

될 때까지 안드로이드 소스 다운로드
android-first-book-master.zip

 

 

Related posts

Leave a Comment